/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package RedeVirtual;

import CollaborativeFilttering.Estruturas.MusicSet;
import CollaborativeFilttering.Estruturas.ValoresOcorrencia;
import Helpers.CustomHashMap;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

/**
 *
 * @author Pedro
 */
public class Grafo {

   private HashMap<Tupla,ValoresOcorrencia> map;

   public Grafo()
   {       
      this.map = new CustomHashMap();
   }

   public void addEntry(MusicSet _1, MusicSet _2)
   {
       this.addEntry(_1, _2,null);
   }

   public void addEntry(MusicSet _1,MusicSet _2, ValoresOcorrencia relacao)
   {
        this.getMap().put(new Tupla(_1,_2),relacao);
   }

   public void remEntry(MusicSet _1, MusicSet _2)
   {
        this.getMap().remove(new Tupla(_1,_2));
   }

   public void remEntry(String _1)
   {
     Set<Tupla> set = this.getMap().keySet();
     Tupla arrTupla[] = new Tupla[set.size()];
     Tupla[] toArray = set.toArray(arrTupla);
     for(int i = 0; i < toArray.length ; i++)
     {
       Tupla t = toArray[i];
       if(t.ponto1.equals(_1) || t.ponto2.equals(_1))
       {
                this.getMap().remove(t);
       }
     }
   }

   public void retornaVizinhos(MusicSet _1, List<MusicSet> lista)
   {      
      for(Tupla t: this.getMap().keySet())
      {
          if(t.ponto1.equals(_1) && !lista.contains(t.ponto2))
          {
              lista.add(t.ponto2);
              retornaVizinhos(t.ponto2,lista);
          }else if(t.ponto2.equals(_1) && !lista.contains(t.ponto1))
          {
              lista.add(t.ponto1);
              retornaVizinhos(t.ponto1,lista);
          }
      }
   } 

   public void printRede()
   { 
      System.out.println("=====imprimindo tabela=====");
      for(Tupla t: this.getMap().keySet())
      {
          System.out.println("key1 : " + t.ponto1 + " key2 : " + t.ponto2 + " valor : " + this.getMap().get(t));
      }
      System.out.println("===========================");
   }

    /**
     * @return the map
     */
    public HashMap<Tupla, ValoresOcorrencia> getMap() {
        return map;
    }

    /**
     * @param map the map to set
     */
    public void setMap(HashMap<Tupla, ValoresOcorrencia> map) 
    {
        this.map = map;
    }
}
